#ifndef __INCLUDES_H__
#define __INCLUDES_H__

#include <stm32f4xx.h>
#include <stdarg.h>

#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"
#include "semphr.h"
#include "queue.h"

/* 发送MQTT数据类型 */
#define TYPE_TEMPERATURE 		1   // 温度
#define TYPE_HUMIDITY 			2   // 湿度
#define TYPE_SR04 				3   // 超声波测距
#define TYPE_FLAME 				4   // 火焰检测
#define TYPE_GAS_CONSISTENCY 	5   // 可燃气体浓度
#define TYPE_GAS_CHECK 			6   // 可燃气体检测
#define LOCK_PICK_RECORD        7   // 开锁记录

/* 四个按钮事件标志位 */
#define EVENT_GROUP_KEY1_DOWN		0x01
#define EVENT_GROUP_KEY2_DOWN		0x02
#define EVENT_GROUP_KEY3_DOWN		0x04
#define EVENT_GROUP_KEY4_DOWN		0x08
#define EVENT_GROUP_KEYALL_DOWN		0x0F

/* OLED动作类型 */
#define OLED_CTRL_DISPLAY_ON        0x01
#define OLED_CTRL_DISPLAY_OFF       0x02
#define OLED_CTRL_INIT              0x03
#define OLED_CTRL_CLEAR             0x04
#define OLED_CTRL_SHOW_STRING       0x05
#define OLED_CTRL_SHOW_CHINESE      0x06
#define OLED_CTRL_SHOW_PICTURE      0x07

/* RTC定时器事件标志位 */
#define EVENT_GROUP_RTC_WAKEUP		0x10

/* RFIF动作类型 */
#define RFID_WRITE_DATE				0x01  // RFID写入数据
#define RFID_WRITE_PW				0x02  // RFID写入密码


/* MQTT用于发送数据的结构体 */
typedef struct _MQTT_Send_Msg_T_{
	uint8_t msg_type;  // 数据类型
	char msg[64];      // 数据
} mqtt_sm_t;

/* OLED显示数据的结构体 */
typedef struct __oled_t
{
	uint8_t ctrl;   // 动作控制
	uint8_t x;		// 起始x轴
	uint8_t y;		// 起始y轴

	uint8_t *str;		// 需要显示的字符串
	uint8_t font_size;  // 数据长度
    uint8_t chinese;
	
	unsigned char *pic;  // 图片
	uint8_t pic_width;
	uint8_t pic_height;
}oled_t;

/* 串口2接收的数据包 */
struct usart2_packet
{
	volatile uint8_t recv_buf[30];
	volatile uint32_t recv_cnt;
};

/* 全局变量 */
extern uint8_t  g_init_end;											// 初始化结束标志
extern volatile uint8_t  g_esp8266_rx_buf[512];  					// MQTT接收数据
extern volatile uint32_t g_esp8266_rx_cnt;       					// MQTT接收的数据长度
extern volatile uint32_t g_esp8266_rx_end;       					// MQTT接收数据结束标志，1表示是，0表示否
extern uint8_t  g_esp8266_tx_buf[512];  							// MQTT发送数据
extern volatile uint32_t g_esp8266_transparent_transmission_sta;    // 记录MQTT当前是否为透传模式，1表示是，0表示否
extern char g_mqtt_msg[256];										// MQTT发送的信息

extern float temperature;   // 温度
extern float humidity;      // 湿度

/* 火焰 */
extern volatile uint32_t adc_fire_val;
extern volatile uint32_t adc_fire_vol;
extern volatile uint8_t Flame_State;

/* 可燃气体 */
extern volatile uint32_t adc_gas_val;
extern volatile uint32_t adc_gas_vol;
extern volatile uint8_t SmokeState;

/*MFRC522数据区*/
extern u8  mfrc552pidbuf[18];
extern u8  card_pydebuf[2];
extern u8  card_numberbuf[5];
extern u8  card_password[16]; 					//卡密（可修改）  
extern u8  card_key0Abuf[6];						//密钥一,初始状态位6个0xff
extern u8  card_writebuf[16];
extern u8  card_readbuf[18];


/* 事件标志组 */
extern EventGroupHandle_t	g_event_group;


/* 互斥型信号量句柄 */
extern SemaphoreHandle_t g_mutex_printf;
extern SemaphoreHandle_t g_mutex_dht;
extern SemaphoreHandle_t g_mutex_oled;

/* 消息队列句柄 */
extern QueueHandle_t g_queue_mqtt_send;  	// 给MQTT发送数据的消息队列
extern QueueHandle_t g_queue_led;  		 	// 控制LED亮灭的消息队列
extern QueueHandle_t g_queue_oled;			// 控制OLED显示的消息队列
extern QueueHandle_t g_queue_beep;			// 控制蜂鸣器的消息队列
extern QueueHandle_t g_queue_usart2;        // 串口2的消息队列
extern QueueHandle_t g_queue_rfid;        	// rfid的消息队列

// 互斥锁
extern SemaphoreHandle_t xMutex;

/* 计数型信号量 */
extern SemaphoreHandle_t g_sem_led;
extern SemaphoreHandle_t g_sem_beep;


/**
 @brief 使用信号量防止printf顺序出错
*/
int printf_safe(const char *format, ...);


#endif  // __INCLUDES_H__
